#! /usr/bin/env node
// (1)正确使用fs
// (2)正确使用http
// (3)正确使用process
// (4)正确使用path
const fs = require('fs')
const path = require('path')
const http = require('http')
const open = require('open')
const {program} = require('commander')


//解析命令参数 封装自定义命令
program.option('-p,--port <item>','设置端口号')
       .parse(process.argv);
const potions = program.opts();//自定义命令的返回值

//容错处理 定义一个默认的端口号 
const port = Number(potions.port)>1000 && Number(potions.port)<10000 ?Number(potions.port):8000


function openServer(){
    //起服务的方法
    http.createServer((req,res)=>{
        //读到public下的html 用于渲染目录
        let html = fs.readFileSync(path.join(__dirname,'./public/index.html'),'utf-8')
        
        //得到当前工程路径
        const curPath = process.cwd() //G:\作业\zy10_15
        //拼接根目录
        const bossPath = path.join(curPath,req.url) //G:\作业\zy10_15\


        //判断根目录是否存在 不存在返回404
        if(fs.existsSync(bossPath)){

            //判断我的根目录是不是一个文件夹  是：读取目录  不是：读取文件内容
            if(fs.statSync(bossPath).isDirectory()){
                //读当前工程文件夹的目录
                const curDirPath = fs.readdirSync(bossPath,'utf-8')// 打印出的是一个数组['index.js','node_modules','package-lock.json','package.json','public']

                //便利这个目录数组并赋值
                let lis = curDirPath.map(item=>{
                    return `
                     <li>
                        <a href="${path.join(req.url,item)}">${item}</a>
                     </li>
                    `
                }).join('')

                //把原本html的占位符给替换成遍历出的li目录  并给html的占位符重新赋值
                html=html.replace('占位符',"<a href='javascript:history.go(-1)'>返回上一级..</a>"+lis)

                //最后发送
                res.end(html)
            }else{
                //不是文件夹，是文件就读取内容并发送
                res.end(fs.readFileSync(bossPath,'utf-8'))
            }
        }else{
            //不存在
            res.end('404')
        }
        
    }).listen(port,async()=>{
        console.log('启动成功端口号为'+port);
        await open(`http://localhost:${port}`)//自动打开
    })
}
openServer()
